/*-------------------------------------------------------------------------
 *
 * query_colocation_checker.h
 *	  General Citus planner code.
 *
 * Copyright (c) Citus Data, Inc.
 *-------------------------------------------------------------------------
 */

#ifndef QUERY_COLOCATION_CHECKER_H
#define QUERY_COLOCATION_CHECKER_H

#include "nodes/parsenodes.h"
#include "nodes/primnodes.h"

#include "distributed/distributed_planner.h"

/*
 * ColocatedJoinChecker is a helper structure that is used to decide
 * whether any subqueries should be recursively planned due joins non
 * colocated joins.
 */
typedef struct ColocatedJoinChecker {
    Query* subquery;
    List* anchorAttributeEquivalences;
    List* anchorRelationRestrictionList;
    PlannerRestrictionContext* subqueryPlannerRestriction;
} ColocatedJoinChecker;

extern ColocatedJoinChecker CreateColocatedJoinChecker(
    Query* subquery, PlannerRestrictionContext* restrictionContext);
extern bool SubqueryColocated(Query* subquery, ColocatedJoinChecker* context);
extern Query* WrapRteRelationIntoSubquery(RangeTblEntry* rteRelation,
                                          List* requiredAttributes,
                                          RTEPermissionInfo* perminfo);
extern List* CreateAllTargetListForRelation(Oid relationId, List* requiredAttributes);
extern List* CreateFilteredTargetListForRelation(Oid relationId,
                                                 List* requiredAttributes);

#endif /* QUERY_COLOCATION_CHECKER_H */
